New function to let user control where columns are dragged.
authorJonathan Blandford <jrb@redhat.com>
Wed, 9 May 2001 22:23:12 +0000 (22:23 +0000)
committerJonathan Blandford <jrb@src.gnome.org>
Wed, 9 May 2001 22:23:12 +0000 (22:23 +0000)
Wed May  9 15:27:22 2001  Jonathan Blandford  <jrb@redhat.com>

* gtk/gtktreeview.c (gtk_tree_view_set_column_drag_function): New
function to let user control where columns are dragged.

* gtk/gtktreeview.c (gtk_tree_view_key_press): Cancel drags if
Escape is pressed.

ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtktreeprivate.h
gtk/gtktreeview.c
gtk/gtktreeview.h

index 3e807737b16340229c1e5db9b438c43d618437c8..53a24030e91e35edf7a06ef2710cf206244e5f3d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Wed May  9 15:27:22 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreeview.c (gtk_tree_view_set_column_drag_function): New
+       function to let user control where columns are dragged.
+
+       * gtk/gtktreeview.c (gtk_tree_view_key_press): Cancel drags if
+       Escape is pressed.
+
 Wed May  9 09:08:44 2001  Jonathan Blandford  <jrb@webwynk.net>
 
        * gtk/gtktreeview.c (gtk_tree_view_class_init): New
index 3e807737b16340229c1e5db9b438c43d618437c8..53a24030e91e35edf7a06ef2710cf206244e5f3d 100644 (file)
@@ -1,3 +1,11 @@
+Wed May  9 15:27:22 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreeview.c (gtk_tree_view_set_column_drag_function): New
+       function to let user control where columns are dragged.
+
+       * gtk/gtktreeview.c (gtk_tree_view_key_press): Cancel drags if
+       Escape is pressed.
+
 Wed May  9 09:08:44 2001  Jonathan Blandford  <jrb@webwynk.net>
 
        * gtk/gtktreeview.c (gtk_tree_view_class_init): New
index 3e807737b16340229c1e5db9b438c43d618437c8..53a24030e91e35edf7a06ef2710cf206244e5f3d 100644 (file)
@@ -1,3 +1,11 @@
+Wed May  9 15:27:22 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreeview.c (gtk_tree_view_set_column_drag_function): New
+       function to let user control where columns are dragged.
+
+       * gtk/gtktreeview.c (gtk_tree_view_key_press): Cancel drags if
+       Escape is pressed.
+
 Wed May  9 09:08:44 2001  Jonathan Blandford  <jrb@webwynk.net>
 
        * gtk/gtktreeview.c (gtk_tree_view_class_init): New
index 3e807737b16340229c1e5db9b438c43d618437c8..53a24030e91e35edf7a06ef2710cf206244e5f3d 100644 (file)
@@ -1,3 +1,11 @@
+Wed May  9 15:27:22 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreeview.c (gtk_tree_view_set_column_drag_function): New
+       function to let user control where columns are dragged.
+
+       * gtk/gtktreeview.c (gtk_tree_view_key_press): Cancel drags if
+       Escape is pressed.
+
 Wed May  9 09:08:44 2001  Jonathan Blandford  <jrb@webwynk.net>
 
        * gtk/gtktreeview.c (gtk_tree_view_class_init): New
index 3e807737b16340229c1e5db9b438c43d618437c8..53a24030e91e35edf7a06ef2710cf206244e5f3d 100644 (file)
@@ -1,3 +1,11 @@
+Wed May  9 15:27:22 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreeview.c (gtk_tree_view_set_column_drag_function): New
+       function to let user control where columns are dragged.
+
+       * gtk/gtktreeview.c (gtk_tree_view_key_press): Cancel drags if
+       Escape is pressed.
+
 Wed May  9 09:08:44 2001  Jonathan Blandford  <jrb@webwynk.net>
 
        * gtk/gtktreeview.c (gtk_tree_view_class_init): New
index 3e807737b16340229c1e5db9b438c43d618437c8..53a24030e91e35edf7a06ef2710cf206244e5f3d 100644 (file)
@@ -1,3 +1,11 @@
+Wed May  9 15:27:22 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreeview.c (gtk_tree_view_set_column_drag_function): New
+       function to let user control where columns are dragged.
+
+       * gtk/gtktreeview.c (gtk_tree_view_key_press): Cancel drags if
+       Escape is pressed.
+
 Wed May  9 09:08:44 2001  Jonathan Blandford  <jrb@webwynk.net>
 
        * gtk/gtktreeview.c (gtk_tree_view_class_init): New
index 3e807737b16340229c1e5db9b438c43d618437c8..53a24030e91e35edf7a06ef2710cf206244e5f3d 100644 (file)
@@ -1,3 +1,11 @@
+Wed May  9 15:27:22 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreeview.c (gtk_tree_view_set_column_drag_function): New
+       function to let user control where columns are dragged.
+
+       * gtk/gtktreeview.c (gtk_tree_view_key_press): Cancel drags if
+       Escape is pressed.
+
 Wed May  9 09:08:44 2001  Jonathan Blandford  <jrb@webwynk.net>
 
        * gtk/gtktreeview.c (gtk_tree_view_class_init): New
index 26370adf92361bba990c3c530eba00b2b582e9fa..2eeac5b74232a659deb00170de42be61668cdf74 100644 (file)
@@ -130,6 +130,8 @@ struct _GtkTreeViewPrivate
   gint header_height;
 
   GtkTreeViewColumnDropFunc *column_drop_func;
+  gpointer column_drop_func_data;
+  GtkDestroyNotify column_drop_func_data_destroy;
   GList *column_drag_info;
   GtkTreeViewColumnReorder *cur_reorder;
 
index ae0f7d40ed16d95e543bd662c053f660f089a950..82f1621e2f52a24f7427bd3c5a6f9629ee5866fd 100644 (file)
@@ -138,6 +138,8 @@ static void     gtk_tree_view_size_allocate        (GtkWidget        *widget,
                                                    GtkAllocation    *allocation);
 static gboolean gtk_tree_view_expose               (GtkWidget        *widget,
                                                    GdkEventExpose   *event);
+static gboolean gtk_tree_view_key_press            (GtkWidget        *widget,
+                                                   GdkEventKey      *event);
 static gboolean gtk_tree_view_motion               (GtkWidget        *widget,
                                                    GdkEventMotion   *event);
 static gboolean gtk_tree_view_enter_notify         (GtkWidget        *widget,
@@ -350,6 +352,7 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
   widget_class->button_release_event = gtk_tree_view_button_release;
   widget_class->motion_notify_event = gtk_tree_view_motion;
   widget_class->expose_event = gtk_tree_view_expose;
+  widget_class->key_press_event = gtk_tree_view_key_press;
   widget_class->enter_notify_event = gtk_tree_view_enter_notify;
   widget_class->leave_notify_event = gtk_tree_view_leave_notify;
   widget_class->focus_in_event = gtk_tree_view_focus_in;
@@ -698,6 +701,13 @@ gtk_tree_view_destroy (GtkObject *object)
       tree_view->priv->cursor = NULL;
     }
 
+  if (tree_view->priv->column_drop_func_data &&
+      tree_view->priv->column_drop_func_data_destroy)
+    {
+      (* tree_view->priv->column_drop_func_data_destroy) (tree_view->priv->column_drop_func_data);
+      tree_view->priv->column_drop_func_data = NULL;
+    }
+
   if (GTK_OBJECT_CLASS (parent_class)->destroy)
     (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
 }
@@ -1324,6 +1334,7 @@ gtk_tree_view_button_release_drag_column (GtkWidget      *widget,
   allocation = tree_view->priv->drag_column->button->allocation;
   allocation.x = tree_view->priv->drag_column_x;
   gdk_pointer_ungrab (GDK_CURRENT_TIME);
+  gdk_keyboard_ungrab (GDK_CURRENT_TIME);
   gdk_window_reparent (tree_view->priv->drag_column->button->window,
                       tree_view->priv->header_window,
                       tree_view->priv->drag_column_x,
@@ -1331,6 +1342,7 @@ gtk_tree_view_button_release_drag_column (GtkWidget      *widget,
   gtk_widget_set_parent_window (tree_view->priv->drag_column->button, tree_view->priv->header_window);
 
   gtk_widget_size_allocate (tree_view->priv->drag_column->button, &allocation);
+  gtk_widget_grab_focus (tree_view->priv->drag_column->button);
 
   if (tree_view->priv->cur_reorder &&
       tree_view->priv->cur_reorder->left_column != tree_view->priv->drag_column)
@@ -2515,6 +2527,24 @@ gtk_tree_view_expose (GtkWidget      *widget,
   return TRUE;
 }
 
+static gboolean
+gtk_tree_view_key_press (GtkWidget   *widget,
+                        GdkEventKey *event)
+{
+  GtkTreeView *tree_view = (GtkTreeView *) widget;
+
+  if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_IN_COLUMN_DRAG))
+    {
+      if (event->keyval == GDK_Escape)
+       {
+         tree_view->priv->cur_reorder = NULL;
+         gtk_tree_view_button_release_drag_column (widget, NULL);
+       }
+      return TRUE;
+    }
+  return FALSE;
+}
+
 /* FIXME Is this function necessary? Can I get an enter_notify event
  * w/o either an expose event or a mouse motion event?
  */
@@ -5111,6 +5141,12 @@ gtk_tree_view_set_column_drag_info (GtkTreeView       *tree_view,
       if (cur_column->visible == FALSE)
        continue;
 
+      if (tree_view->priv->column_drop_func &&
+         (* tree_view->priv->column_drop_func) (tree_view, column, left_column, cur_column, tree_view->priv->column_drop_func_data))
+       {
+         left_column = cur_column;
+         continue;
+       }
       reorder = g_new (GtkTreeViewColumnReorder, 1);
       reorder->left_column = left_column;
       left_column = reorder->right_column = cur_column;
@@ -5238,6 +5274,9 @@ _gtk_tree_view_column_start_drag (GtkTreeView       *tree_view,
                    FALSE,
                    GDK_POINTER_MOTION_MASK|GDK_BUTTON_RELEASE_MASK,
                    NULL, NULL, GDK_CURRENT_TIME);
+  gdk_keyboard_grab (tree_view->priv->drag_window,
+                    FALSE,
+                    GDK_CURRENT_TIME);
 
 }
 
@@ -5470,13 +5509,6 @@ gtk_tree_view_new_column_width (GtkTreeView *tree_view,
 }
 
 
-static void
-gtk_tree_view_ensure_scroll_timeout (GtkTreeView *tree_view, GFunc func)
-{
-  if (tree_view->priv->scroll_timeout == 0)
-    tree_view->priv->scroll_timeout = gtk_timeout_add (50, func, tree_view);
-}
-
 /* Callbacks */
 static void
 gtk_tree_view_adjustment_changed (GtkAdjustment *adjustment,
@@ -6230,6 +6262,40 @@ gtk_tree_view_get_expander_column (GtkTreeView *tree_view)
   return tree_view->priv->expander_column;
 }
 
+
+/**
+ * gtk_tree_view_set_column_drag_function:
+ * @tree_view: A #GtkTreeView.
+ * @func: A function to determine which columns are reorderable, or NULL.
+ * @user_data: User data to be passed to @func, or NULL
+ * @destroy: Destroy notifier for @user_data, or NULL
+ * 
+ * Sets a user function for determining where a column may be dropped when
+ * dragged.  This function is called on every column pair in turn at the
+ * beginning of a column drag to determine where a drop can take place.  The
+ * arguments passed to @func are: the @tree_view, the #GtkTreeViewColumn being
+ * dragged, the two #GtkTreeViewColumn s determining the drop spot, and
+ * @user_data.  If either of the #GtkTreeViewColumn arguments for the drop spot
+ * are NULL, then they indicate an edge.  If @func is set to be NULL, then
+ * @tree_view reverts to the default behavior of allowing all columns to be
+ * dropped everywhere.
+ **/
+void
+gtk_tree_view_set_column_drag_function (GtkTreeView               *tree_view,
+                                       GtkTreeViewColumnDropFunc  func,
+                                       gpointer                   user_data,
+                                       GtkDestroyNotify           destroy)
+{
+  g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
+
+  if (tree_view->priv->column_drop_func_data_destroy)
+    (* tree_view->priv->column_drop_func_data_destroy) (tree_view->priv->column_drop_func_data);
+
+  tree_view->priv->column_drop_func = func;
+  tree_view->priv->column_drop_func_data = user_data;
+  tree_view->priv->column_drop_func_data_destroy = destroy;
+}
+
 /**
  * gtk_tree_view_scroll_to_point:
  * @tree_view: a #GtkTreeView
index e9b65b0222ed6b5e6aa66c5756f44f3ff17f16c5..9d2131eb7c104631a60997c25471515e120f0bc9 100644 (file)
@@ -146,6 +146,10 @@ void                   gtk_tree_view_move_column_after             (GtkTreeView
 void                   gtk_tree_view_set_expander_column           (GtkTreeView               *tree_view,
                                                                    gint                       col);
 gint                   gtk_tree_view_get_expander_column           (GtkTreeView               *tree_view);
+void                   gtk_tree_view_set_column_drag_function      (GtkTreeView               *tree_view,
+                                                                   GtkTreeViewColumnDropFunc  func,
+                                                                   gpointer                   user_data,
+                                                                   GtkDestroyNotify           destroy);
 
 /* Actions */
 void                   gtk_tree_view_scroll_to_point               (GtkTreeView               *tree_view,